package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ISalaryCalculateRuleGroupDAO;
import org.jsola.hr.dto.IssueSalaryCalculateRuleDTO;
import org.jsola.hr.dto.SalaryCalculateRuleGroupAddDTO;
import org.jsola.hr.dto.SalaryCalculateRuleGroupUpdateDTO;
import org.jsola.hr.entity.SalaryCalculateRuleGroupDO;
import org.jsola.hr.query.SalaryCalculateRuleEmpInfoQuery;
import org.jsola.hr.query.SalaryCalculateRuleGroupQuery;
import org.jsola.hr.vo.EmpInfoVO;
import org.jsola.hr.vo.SalaryCalculateRuleGroupListVO;
import org.jsola.hr.vo.SalaryCalculateRuleGroupVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 工价计算规则组
 *
 * @author zhr
 */
public interface ISalaryCalculateRuleGroupService extends IService<ISalaryCalculateRuleGroupDAO, SalaryCalculateRuleGroupDO> {

    /**
     * 新增工价计算规则组
     *
     * @param salaryCalculateRuleGroupAddDTO 新增工价计算规则组DTO
     * @param tokenUser                      当前用户
     * @return 工价计算规则组详情信息
     */
    SalaryCalculateRuleGroupVO save(SalaryCalculateRuleGroupAddDTO salaryCalculateRuleGroupAddDTO, TokenUser tokenUser);

    /**
     * 修改工价计算规则组
     *
     * @param salaryCalculateRuleGroupUpdateDTO 修改工价计算规则组DTO
     * @param tokenUser                         当前用户
     * @return 更新数量
     */
    int update(SalaryCalculateRuleGroupUpdateDTO salaryCalculateRuleGroupUpdateDTO, TokenUser tokenUser);

    /**
     * 根据规则组id  查询来源是该id的规则组  设置查询到的规则组的来源为null
     * @param groupId 规则组id
     * @param tokenUser 当前用户
     */
    void setSourceIsNull(String groupId, TokenUser tokenUser);


    /**
     * 批量删除工价计算规则组，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser                   当前用户
     * @param salaryCalculateRuleGroupIds 工价计算规则组id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... salaryCalculateRuleGroupIds);

    /**
     * 根据工价计算规则组id查找
     *
     * @param salaryCalculateRuleGroupId 工价计算规则组id
     * @param siteId                     所属站点id
     * @return 工价计算规则组详情信息
     */
    SalaryCalculateRuleGroupVO selectById(String salaryCalculateRuleGroupId, String siteId);

    /**
     * 查询工价计算规则组
     *
     * @param salaryCalculateRuleGroupQuery 查询条件
     * @param siteId                        所属站点id
     * @return 工价计算规则组列表信息
     */
    List<SalaryCalculateRuleGroupListVO> select(SalaryCalculateRuleGroupQuery salaryCalculateRuleGroupQuery, String siteId);

    /**
     * 查询工价计算规则组记录数
     *
     * @param salaryCalculateRuleGroupQuery 查询条件
     * @param siteId                        所属站点id
     * @return 工价计算规则组记录数
     */
    int selectCount(SalaryCalculateRuleGroupQuery salaryCalculateRuleGroupQuery, String siteId);

    /**
     * 分页查询工价计算规则组
     *
     * @param salaryCalculateRuleGroupQuery 查询条件
     * @param siteId                        所属站点id
     * @return 工价计算规则组列表信息
     */
    Page<SalaryCalculateRuleGroupListVO> selectPage(SalaryCalculateRuleGroupQuery salaryCalculateRuleGroupQuery, String siteId);


    /**
     * 根据工价计算规则组id查找
     *
     * @param salaryCalculateRuleGroupId 工价计算规则组id
     * @param siteId                     所属站点id
     * @return 工价计算规则组
     */
    SalaryCalculateRuleGroupDO selectDOById(String salaryCalculateRuleGroupId, String siteId);

    /**
     * 查询工价计算规则组
     *
     * @param salaryCalculateRuleGroupQuery 查询条件
     * @param siteId                        所属站点id
     * @return 工价计算规则组列表
     */
    List<SalaryCalculateRuleGroupDO> selectDO(SalaryCalculateRuleGroupQuery salaryCalculateRuleGroupQuery, String siteId);

    /**
     * 下发规则
     *
     * @param issueSalaryCalculateRuleDTO 下发的数据
     * @param tokenUser                   当前用户
     * @return 下发的数量
     */
    Integer issueGroup(IssueSalaryCalculateRuleDTO issueSalaryCalculateRuleDTO, TokenUser tokenUser);

    /**
     * 设置返回参数前端规则使用人数
     *
     * @param salaryCalculateRuleGroupListVO VO
     * @param tokenUser                      当前用户
     */
    void setUsePeopleNumber(SalaryCalculateRuleGroupListVO salaryCalculateRuleGroupListVO, TokenUser tokenUser);

    /**
     * 根据规则id查询使用的员工信息(用工单位使用)
     *
     * @param salaryCalculateRuleEmpInfoQuery 工价规则使用人员查询
     * @param tokenUser                       当前用户
     * @return 员工列表
     */
    Page<EmpInfoVO> selectEmpInfoVoCompanyUse(SalaryCalculateRuleEmpInfoQuery salaryCalculateRuleEmpInfoQuery, TokenUser tokenUser);


    /**
     * 根据规则id查询使用的员工信息(租户级别使用)
     *
     * @param salaryCalculateRuleEmpInfoQuery 工价规则使用人员查询
     * @param tokenUser                       当前用户
     * @return 员工列表
     */
    Page<EmpInfoVO> selectEmpInfoVoSiteUse(SalaryCalculateRuleEmpInfoQuery salaryCalculateRuleEmpInfoQuery, TokenUser tokenUser);

    /**
     * 根据公司id及名称查询规则组（默认最新的返回一个）
     *
     * @param companyId 用工单位id
     * @param name      名称
     * @return 规则组信息 or NULL
     */
    SalaryCalculateRuleGroupDO selectByCompanyIdAndName(String companyId, String name);

    /**
     * 查询公司下下发的工价计算规则组
     *
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     * @return 工价计算规则组列表
     */
    List<SalaryCalculateRuleGroupDO> selectHadSourceByCompanyId(String companyId, TokenUser tokenUser);

    /**
     * 根据来源查询规则组
     *
     * @param source 来源
     * @param siteId 租户id
     * @return 工价计算规则组列表
     */
    List<SalaryCalculateRuleGroupDO> selectBySource(String source, String siteId);

}


